#ifndef eeprom_H
#define eeprom_H
#ifdef __cplusplus
extern "C"
{
#endif
    /*
        Chinese is encoded in Unicode. If it is garbled, please change the encoding method of the editor.
        EEPROM库 By启凡科创 适用于STC8平台MCU

        一定要包含相对应的头文件！！！

        目前仅支持512字节以内的长度，请勿超出

        使用流程：
            1.开机正确注册时钟eeprom_set_clk()
            一个完整的操作读取流程：
                eeprom_begin();         //开始eeprom操作
                eeprom_write(0,0xaa);   //向位置0写入数据0xaa
                x = eeprom_read(20);    //读取位置20的数据赋值给x
                eeprom_commit();        //将缓冲数据写入eeprom,不提交数据写入将无效
                eeprom_end();           //结束eeprom操作，防止发生故障
            2.使用eeprom_write_bytes和eeprom_read_bytes一次性写入和读取，避免用法1的繁琐操作
        version:v1.0.0  2022-11-7
    */

#include "LIB_CONFIG.h"
#ifndef EEPROM_EN
#define EEPROM_EN 0 // 如果配置文件未定义，则用户自定义，0禁用模块不不编译，1启用模块
#endif

#ifndef __EEPROM_H__
#define __EEPROM_H__

#if EEPROM_EN

// 平台选择
#define STC8A8K64S4A12_8F_TYPE // 早期28I的8a\8F系列单片机，不是的话务必注释,8A8K64D4不属于也需注释

#ifdef EEPROM_MAX_SIZE
#define EEPROM_SIZE EEPROM_MAX_SIZE
#else
// 如果配置文件未定义，使用的字节数，尽量少以节约内存资源提升速度
#define EEPROM_SIZE 32
#endif

    /**
     * @brief 设置系统工作时钟,必须正确设置后EEPROM才能工作！
     *
     * @param sys_clk 如系统工作在11.0592MHz，则为 eeprom_set_clk(11059200)
     */
    void eeprom_set_clk(uint32_t sys_clk);

    /**
     * @brief 开始EEPROM操作，使用完务必使用end结束
     *
     * @return uint8_t 成功返回1，失败返回0
     */
    uint8_t eeprom_begin();

    /**
     * @brief 结束EEPROM操作
     */
    void eeprom_end();

    /**
     * @brief 写一个字节数据到缓冲区
     *
     * @param addr 地址
     * @param dat 数据
     */
    void eeprom_write(uint16_t addr, uint8_t dat);

    /**
     * @brief 读取值
     *
     * @param addr 地址
     * @return uint8_t 数据
     */
    uint8_t eeprom_read(uint16_t addr);

    /**
     * @brief 将缓冲区内容提交到物理EEPROM区存储
     *
     * @return uint8_t 成功返回1，失败返回0
     */
    uint8_t eeprom_commit();

    /**
     * @brief 从指定位置写入指定长度的数据，
     * 此接口将自动执行begin、write、commit、end一系列操作，无需自己调用
     *
     * @param addr 写入的起始地址
     * @param dat 指向待写入的数据
     * @param len 写入长度
     * @return uint8_t 成功返回1，失败返回0
     */
    uint8_t eeprom_write_bytes(uint16_t addr, uint8_t *dat, uint16_t len);

    /**
     * @brief 从指定位置读取指定长度的数据，
     * 此接口将自动执行begin、read、end一系列操作，无需自己调用
     *
     * @param addr 读取的起始地址
     * @param buffer 指向读取出的数据存储的缓存数据地址
     * @param len 读取长度
     * @return uint8_t 成功返回1，失败返回0
     */
    uint8_t eeprom_read_bytes(uint16_t addr, uint8_t *buffer, uint16_t len);

#endif
#endif

#ifdef __cplusplus
}
#endif
#endif
